gusucode.com > 现代通信系统——使用MATLAB(+全部程序) > 现代通信系统——使用MATLAB(+全部程序)/现代通信系统——使用MATLAB(+全部程序)/Matlab 程序/Chapter10/programs/prgs/depfun/qaskenco.m
function [x,y]=qaskenco(msg,M) %QASKENCO Map a message to a QASK square signal constellation. % QASKENCO(M) plots a QASK square constellation with M-ary number M. % M must be an integer power of 2. % % QASKENCO(MSG, M) plots the location of MSG in constellation with % M-ary number M. The elements in MSG must be integers in the range % [0, M-1]. % % [X, Y] = QASKENCO(M) outputs the in-phase and quadrature components % of the QASK square constellation in variables X and Y respectively. % % [X, Y] = QASKENCO(MSG, M) encodes the message signal given in MSG % into in-phase and quadrature component variables X and Y. % % The output signal constellations are scaled such that the minimum % distance between adjacent signal points is 2. % % This function generates a Gray code with K = log2(M) bits, when K % is an even integer. When K is an odd integer, this function generates a % non-Gray-code near-square constellation. % % See also QASKDECO. % Copyright 1996-2001 The MathWorks, Inc. % $Revision: 1.15 $ if nargin < 1 disp('Usage: QASKENCO(M)'); end; plot_type = []; if nargin == 1 M = msg; plot_type = 'N'; elseif isstr(M) plot_type = M; M = msg; end; if M < 0 error('M must be a positive number.'); end; K = log2(M); if floor(K) ~= K error('M must equal an integer power of 2.'); end; if ~isempty(plot_type) msg = 0:M-1; end; if any(msg<0) | any(msg>M-1) error('Input message to QASKENCO must be integers in the range [0, M-1].'); end msg = msg + 1; % define a table for the coding. [tabx, taby] = QASKConstlation(K); if nargout > 0 % Encode the message x = tabx(msg); y = taby(msg); else % Plot the constellation if isempty(plot_type) plot_type = 'N'; end lims = max(max([tabx(msg) taby(msg)])) * [-1 1]; axx = lims + [-1 1]; if findstr(lower(plot_type), 'n') handle = plot(tabx(msg), taby(msg), 'r.',... [max(tabx(msg)) min(tabx(msg))],[0 0], 'k-',... [0 0], [max(taby(msg)) min(taby(msg))], 'k-'); set(handle(1),'Markersize',12); set(get(handle(1),'parent'), ... 'box','off',... 'defaulttextfontsize', 9,... 'Ylim',axx,... 'Xlim',axx ); for i = 1 : length(msg) text(tabx(msg(i)), taby(msg(i)), num2str(msg(i)-1)); end; else handle = plot(tabx(msg), taby(msg), plot_type,... axx, [0 0], 'k-', [0 0], axx, 'k-'); end axis('square'); set(handle(2), 'Xdata', get(get(handle(2), 'parent'), 'Xlim')); set(handle(3), 'Ydata', get(get(handle(3), 'parent'), 'Ylim')); set(gca, 'xtick', lims(1):2:lims(2), 'ytick', lims(1):2:lims(2)); pos = get(gcf, 'position'); pos = [pos(1) pos(2)-(pos(3)-pos(4)) pos(3) pos(3)]; set(gcf,'position',pos); xlabel('In-phase'); ylabel('Quadrature'); title('QASK Constellation'); end; %------------------------------------------------------------------ function [xt, yt] = QASKConstlation(K) % Output the constellation in-phase and quadrature components. xx = constlay(K, 1); [leny, lenx] = size(xx); [xt, yt]= meshgrid([1-lenx : 2 : lenx-1], [leny-1 : -2 : 1-leny]'); xx = xx(:); xt = xt(:); yt = yt(:); tmp = isnan(xx); if ~isempty(tmp) xx(tmp) = []; xt(tmp) = []; yt(tmp) = []; end; [xx, tmp] = sort(xx); xt = xt(tmp); yt = yt(tmp); % [EOF]